/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Reportes.Controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JFileChooser;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import pe.edu.pucp.Maestros.DAO.AeropuertoDAO;
import pe.edu.pucp.Modelo.Aeropuerto;
import pe.edu.pucp.Modelo.Permiso;
import pe.edu.pucp.Modelo.Usuario;
import pe.edu.pucp.Modelo.Vuelo;
import pe.edu.pucp.Reportes.DAO.ReporteSaturacionDAO;
import pe.edu.pucp.Reportes.Vista.ReporteSaturacionGUI;
import pe.edu.pucp.Simulacion.Controlador.SimulacionControlador;
import pe.edu.pucp.Simulacion.Vista.SimulacionGUI;
import pe.edu.pucp.Util.Reportclass.SaturacionDataSource;
import pe.edu.pucp.Util.Reportclass.SaturacionDatasourceVuelo;
import pe.edu.pucp.Util.ValHelper;

/**
 *
 * @author jorge
 */
public class ReporteSaturacionControlador {
    private ReporteSaturacionDAO dao;
    private ReporteSaturacionGUI view;
    private ArrayList<Aeropuerto> lstAeropuerto;
    private ArrayList<Aeropuerto> lstAeropuertoImprimir;
    private ArrayList<Aeropuerto> lstAeropuertoSalida = new ArrayList<>();
    private ArrayList<Vuelo> lstVuelo;
    private ArrayList<Vuelo> lstVueloImprimir;
    
    private Usuario user;

    
    public ReporteSaturacionControlador(ReporteSaturacionDAO rsdao, ReporteSaturacionGUI rsview, Usuario usr){
        dao=rsdao;
        view=rsview; 
        user = usr;
        lstAeropuerto =dao.listarTodosAeropuertos();
        view.mostrarPermisos(new  ArrayList<Permiso>(usr.getPerfil().getPermisos()));
        view.llenaGrillaVuelos(lstVuelo);
        
        view.addAbrifFileListener(new AbrirFile());
        view.addBuscarListener(new MostrarSaturacion());
        view.addLimpiarListener(new Limpiar());
        view.addGenerarListener(new ImprimirPdf());        
        view.addSimulacionBtnListener(new MostrarSimulacion());
        view.addValidadorSoloNumero(new ValidaSoloNumeros());
    }
    
    class Limpiar implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            view.llenaGrilla(new ArrayList<Aeropuerto>());
            view.llenaGrillaVuelos(new ArrayList<Vuelo>());
        }
        
    }
    
    class MostrarSaturacion implements ActionListener
    {
        private void SaturacionAeropuerto()
        {
                double porcentaje = view.getPorcentaje();
            
                if (porcentaje <0 || porcentaje > 1)
                {
                    ValHelper.mostrarAviso("El porcentaje de la saturación de los aeropuertos debe ser de 0 a 1.");
                }
                else
                {
                    lstAeropuertoImprimir = dao.ConsultaObtenerSaturacion(view.getAnhoInicio(),view.getMesInicio(),view.getAnhoFin(),view.getMesFIn(),porcentaje);
                    lstAeropuertoSalida.clear();            
            
                    for(Aeropuerto a : lstAeropuerto )
                    {
                        Aeropuerto uno = new Aeropuerto();                       
                    
                        double promedio=0;
                        int contador=0;
                            for(Aeropuerto b: lstAeropuertoImprimir )
                            {
                                if(b.getIdaeropuerto()==a.getIdaeropuerto())
                                {
                                    uno.setIdaeropuerto(b.getIdaeropuerto());
                                    uno.setCiudad(a.getCiudad());
                                    uno.setDescripcion(a.getDescripcion());     
                                    uno.setCappack(a.getCappack());
                                    contador++;
                                    promedio+=b.getCostpack();
                                }
                            }
                            if(contador!=0)
                            {
                                uno.setFechareg(a.getFechareg());
                                uno.setCostpack(Math.round(promedio/contador));
                                lstAeropuertoSalida.add(uno);
                            }
                    }
                    view.llenaGrilla(lstAeropuertoSalida);
                }            
            
        }
        
        private void SaturacionVUelo()
        {
            double porcentajeVuelo = view.getPorcentajeVuelo();
            if (porcentajeVuelo <0 || porcentajeVuelo > 1)
                ValHelper.mostrarAviso("El porcentaje de la saturación de vuelos es de 0 a 1.");
            else
            {
                lstVueloImprimir =dao.ConsultaObtenerSaturacionVuelo(view.getAnhoInicio(),view.getMesInicio(),view.getAnhoFin(),view.getMesFIn(),porcentajeVuelo);
                view.llenaGrillaVuelos(lstVueloImprimir);
            }
        }
        
        @Override
        public void actionPerformed(ActionEvent e) {
            if(view.getAnhoInicio()*100+view.getMesInicio()>view.getAnhoFin()*100+view.getMesFIn())
            {
                ValHelper.mostrarAviso("Vuelva a definir las fechas de busqueda");
            }
            else
            {
                SaturacionAeropuerto();
                SaturacionVUelo();
            }            
        }
            
        
    }
    
    class MostrarSimulacion implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            SimulacionGUI simulacionView ;
            SimulacionControlador simulacionControlador = null;
            if (lstAeropuertoSalida != null && lstAeropuertoSalida.size()>0){
                //Muestro ventana de simulacion
                simulacionView = new SimulacionGUI(view.getPadre(), true, user, lstVueloImprimir);
                simulacionControlador = new SimulacionControlador(view.getPorcentaje(), view.getPorcentajeVuelo(),new AeropuertoDAO(), lstAeropuertoSalida,simulacionView, user, view.getFolderPath(), lstVueloImprimir);
                simulacionView.setVisible(true);
            } else 
                //Muestro la simulacion con lstAeropuertos
                if (lstAeropuerto != null && lstAeropuerto.size()>0) {
                    simulacionView = new SimulacionGUI(view.getPadre(), true, user, lstVueloImprimir);

                    simulacionControlador = new SimulacionControlador(view.getPorcentaje(), view.getPorcentajeVuelo(),new AeropuertoDAO(), lstAeropuerto, simulacionView, user, view.getFolderPath(), lstVueloImprimir);
                    simulacionView.setVisible(true);
                }
                else 
                    ValHelper.mostrarError("No existen aeropuertos para iniciar la simulación.");
            
        }
    
    }
    
    class ValidaSoloNumeros extends KeyAdapter {
        @Override
        public void keyTyped(KeyEvent e) {
            ValHelper.soloDigitoPunto(e);
        }   
    }
    
    class ImprimirPdf implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e) {
           
            if ("/HOME".equals(view.getFolderPath().toUpperCase()))
            {
                ValHelper.mostrarAviso("No posee permisos en el directorio /Home"); 
            }else
            {
            try{
//                lstAeropuerto = dao.ConsultaObtenerSaturacion(view.getAnhoInicio(),view.getMesInicio(),view.getAnhoFin(),view.getMesFIn(), view.getPorcentaje());

                SaturacionDataSource datasource = new SaturacionDataSource();
                int a = lstAeropuerto.size();
                for (int i=0;i<lstAeropuerto.size();i++){               
                    datasource.addLog(lstAeropuerto.get(i));
                } 
                String master = System.getProperty("user.dir");
                master += "/../SIGEPA_sist/src/main/resources/Recurso/jasper/saturacion.jasper";
                JasperReport reporte = (JasperReport)JRLoader.loadObjectFromFile(master);                
                JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, datasource);

                JRExporter exporter = new JRPdfExporter();  
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);                 
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File(view.getFolderPath()+"/"+"Reporte Saturacion Aeropuerto"+new Date()+".pdf")); 

                exporter.exportReport();
                ValHelper.mostrarAviso("Se genero el reporte de los aeropuertos exitosamente"); 
            }catch  (JRException ex){   
            }
            
            try{
//                lstVueloImprimir = dao.ConsultaObtenerSaturacionVuelo(view.getAnhoInicio(),view.getMesInicio(),view.getAnhoFin(),view.getMesFIn(), view.getPorcentajeVuelo());

                SaturacionDatasourceVuelo datasource = new SaturacionDatasourceVuelo();
                int a = lstVueloImprimir.size();
                for (int i=0;i<lstVueloImprimir.size();i++){                
                    datasource.addLog(lstVueloImprimir.get(i));
                } 
                
                String master = System.getProperty("user.dir");
                master += "/../SIGEPA_sist/src/main/resources/Recurso/jasper/saturacionvuelo.jasper";
                JasperReport reporte = (JasperReport)JRLoader.loadObjectFromFile(master);                
                JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, datasource);

                JRExporter exporter = new JRPdfExporter();  
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);                 
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File(view.getFolderPath()+"/"+"Reporte Saturacion Vuelos"+new Date()+".pdf")); 

                exporter.exportReport();
                ValHelper.mostrarAviso("Se genero el reporte de vuelos exitosamente"); 
            }catch  (JRException ex){   
            }            
        }
        }
    }
    
     class AbrirFile implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            JFileChooser filechooser = new JFileChooser();
            filechooser.setDialogTitle("Seleccione una carpeta");
            filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            int result = filechooser.showOpenDialog(null); 
            if (result == JFileChooser.APPROVE_OPTION){
               String path = filechooser.getSelectedFile().getPath();
                    view.setNombrePathArchivo(path);                
            }         
        }     
    }
 }



